import random
from IndiceDeEncontrameSiPodes import *
from CargadorDeIndice import *
from Referencia import *
from EncontrameSiPodes import *

class GeneradorDeEncontrameSiPodes:
    def __init__(self, indice):
        self.__indice = indice

    def generarEncontrameSiPodes(self, ruta):
        palabras = self.__indice.buscarTodasLasPalabrasDe(ruta)
        consignas = self.__indice.buscarTodasLasConsignasDe(ruta)

        referenciasElegidas = list()

        noTermino = True
        while noTermino:
            palabraR = random.sample(palabras, 1)
            palabra = palabraR[0]
            #print(palabra)
            #print("Referencias")
            referenciasElegidas = list()
            for i in range(0, palabra.__len__()):
                noTermino = False
                nuevaReferencia = self.__buscarReferencia(i+1, palabra[i], referenciasElegidas, consignas)
                if nuevaReferencia.corrimiento() == -1:
                    noTermino = True
                    break
                referenciasElegidas.insert(i, nuevaReferencia)
                #print(nuevaReferencia.consigna().respuesta())
                #print(nuevaReferencia.ubicacion())

        esp = EncontrameSiPodes(referenciasElegidas)
        return esp
            
                
        
    def __buscarReferencia(self,ubicacion, letra, referenciasElegidas, consignas):
        corrimiento = -1
        iteracion = 0
        while corrimiento < 0:
            iteracion = iteracion + 1
            consignaR = random.sample(consignas, 1)
            consigna = consignaR[0]
            if self.__yaExisteEnLasReferencias(consigna, referenciasElegidas):
                break
            corrimiento = self.__buscarCorrimiento(letra, consigna)
            if iteracion > consignas.__len__()*2:
                break
        referencia = Referencia(consigna, ubicacion, corrimiento)

        return referencia

    def __yaExisteEnLasReferencias(self, consigna, referenciasElegidas):
        existe = False
        for referencia in referenciasElegidas:
            if consigna == referencia.consigna():
                existe = True
                break
        return existe

    def __buscarCorrimiento(self, letra, consigna):
        palabra = str(consigna.respuesta())
        corrimiento = -1
        #print(palabra.__len__())
        #print(palabra)
        for i in range(0, palabra.__len__()):
            if palabra[i] == letra:
                corrimiento = i
                break

        return corrimiento

#cargador = CargadorDeIndice()
#indice = cargador.nuevoIndice()

#g = GeneradorDeEncontrameSiPodes(indice)
#esp = g.generarEncontrameSiPodes(["Historia"])
#for referencia in esp.referencias():
#    print(referencia.consigna().respuesta())
#    print(referencia.ubicacion())
#    print(referencia.corrimiento())
        
